/*
*
==============================================================================
*  Name        : 
*  Part of     : Omen Game Engine
*  Description : 
*  Version     : 1.0
*
*  Copyright (c) 2013 Lauri Kortevaara.
* 
==============================================================================
*/

#pragma once

#include "OmenConfig.h"
#include "IOmenKernel.h"
#include "IOmenScene.h"
#include "IOmenModel.h"
#include "IOmenMesh.h"
#include "IOmenMaterial.h"
#include "IOmenTimer.h"
#include "IOmenFileUtils.h"
#include "IOmenOctree.h"
#include "IOmenCamera.h"
#include "IOmenRigidBody.h"

namespace Omen 
{
    class IOmenFactory 
    {
    public:
        virtual IKernel&    getKernel() = 0;

        virtual std::unique_ptr<IScene>  newSceneObject() = 0;  // Factory function for creating a new scene object
        virtual IModel*     newModelObject() = 0;   // Factory function for creating a new model object
        virtual IMesh*      newMeshObject()  = 0;   // Factory function for creating a new mesh object
        virtual ICamera*    newCamera() = 0;        // Facotry function for creating a new camera
        virtual IMaterial*  newMaterialObject() = 0; // Factory function for creating a new material object
        
        virtual std::unique_ptr<ITexture> newTextureObject() = 0; // Factory function for creating a new texture object
        virtual std::unique_ptr<IRigidBody> newRigidBody() = 0;   // Factory function for creating a new rigid body object

        virtual ITimer*     newTimer()  = 0;        // Factory function for creating a new timer
        virtual IFileUtils& fileUtils() = 0;        // Factory function for createing a new File Utils object

        
    };
}

OMEN_API Omen::IOmenFactory& GetOmenFactory();